# 解密Python lambda：小身材大能量的匿名函数
#[钛妹]: 钛哥你看！外卖满减计算总写重复代码，能优化吗？
#[钛哥]: 这就该lambda出场了！先看个简单例子：
calc_bonus = lambda order: order*0.1 if order>50 else 0
print(calc_bonus(68))  # 输出6.8元补贴

#[钛妹]: 这个箭头符号好有趣！和普通函数区别是？
#[钛哥]: 关键三点记牢：
# 1. 没有函数名，匿名战士
# 2. 只能写一行表达式
# 3. 自动返回计算结果

#[钛妹]: 那多参数支持吗？比如计算配送费？
#[钛哥]: 完全OK！看距离+重量计费：
delivery_fee = lambda km,kg: (km*3 + kg*2) if km<5 else kg*5
print("配送费:", delivery_fee(3, 2))  # 3 * 3 + 2 * 2=13

#[钛妹]: 要是参数个数不确定怎么办呀？
#[钛哥]: 配合*args更灵活！星号解包：
total_price = lambda *items: sum(items)*0.8
print("折后总价:", total_price(35,48,22))  # 105 * 0.8=84

#[钛妹]: 听说排序时特别好用？比如按字符串长度...
#[钛哥]: 敏锐！sorted的key参数常客：
fruits = ["apple", "kiwi", "durian"]
print(sorted(fruits, key=lambda x: len(x)))  # 按长度排序

#[钛妹]: 和map配合是不是更强大？比如批量处理...
#[钛哥]: 函数式编程三剑客！看实例：
prices = [100, 200, 300]
print(list(map(lambda x: x*0.8, prices)))  # 打八折

#[钛妹]: 过滤数据呢？比如筛选偶数？
#[钛哥]: filter+lambda黄金组合：
nums = [7, 12, 5, 24]
print(list(filter(lambda x: x%2==0, nums)))  # [12,24]

#[钛妹]: 能用来做函数工厂吗？比如生成不同税率？
#[钛哥]: 闭包特性大显身手！看这个：
def tax_generator(rate):
    return lambda x: x * (1 + rate)

vat = tax_generator(0.17)    # 增值税17%
print(vat(1000))  # 1170.0

#[钛妹]: 类型注解能加吗？比如指定参数类型？
#[钛哥]: Python3.12+支持！这样写：
from typing import Callable
discount: Callable[[float], float] = lambda x: x*0.9
print(discount(200))  # 180.0

#[钛妹]: 错误处理怎么办？比如除零错误？
#[钛哥]: 需要在外层包裹try-except：
safe_div = lambda a,b: a/b if b!=0 else float('inf')
print(safe_div(10,0))  # 返回无穷大

#[钛妹]: 和普通函数比有什么优劣？
#[钛哥]: 对比实验见真章：
def square_def(x):
    return x**2

square_lambda = lambda x: x**2

# 执行效率测试
import timeit
print("def耗时:", timeit.timeit('square_def(10)', globals=globals()))
print("lambda耗时:", timeit.timeit('square_lambda(10)', globals=globals()))

#[钛妹]: 哇！效率几乎一样呢！
#[钛哥]: 但复杂逻辑还是def更合适哦~

#[钛妹]: 在GUI开发中有应用吗？
#[钛哥]: 按钮事件绑定超方便！假设有tkinter：
import tkinter as tk
root = tk.Tk()
btn = tk.Button(root, text="点击", 
               command=lambda: print("按钮被点击"))
btn.pack()
# root.mainloop()  # 实际使用需取消注释

#[钛妹]: 最后能不能来个炫技操作？
#[钛哥]: 看好了！矩阵转置：
matrix = [[1,2], [3,4], [5,6]]
transpose = list(map(lambda x: list(x), zip(*matrix)))
print("转置后:", transpose)  # [[1,3,5],[2,4,6]]

#[钛妹]: 总结今天学的：
# 1. lambda是匿名函数快枪手
# 2. 适合简单逻辑，复杂用def
# 3. 函数式编程好搭档
# 4. 闭包特性玩出花
#[钛哥]: 还差一个重点没说！
# 5. 可读性优先，别炫技过度

#[钛妹]: 对了各位！持续学习才是硬道理！点赞关注不迷路！